﻿using Ortodoctor.gridComponent;
using Ortodoctor.Componentes;
using Ortodoctor.modelo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Ortodoctor.Funcionario
{
    public partial class Tratamento : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["USUARIO"] == null)
                Response.Redirect("Login.aspx");

            modeloProcedimentoCliente model = new modeloProcedimentoCliente();
            Grid grid = new Grid(model.getAll(), "id_procedimento_cliente");
            Session["GRID_TRATAMENTO"] = grid;

            selectID.ClientIDMode = System.Web.UI.ClientIDMode.Static;
            procedimento.ClientIDMode = System.Web.UI.ClientIDMode.Static;
            dentista.ClientIDMode = System.Web.UI.ClientIDMode.Static;

            modeloCliente modelo = new modeloCliente();
            DataTable dt = modelo.getAll();
            dt.DefaultView.Sort = "[nome] ASC";
            dt = dt.DefaultView.ToTable();
            
            foreach (DataRow dr in dt.Rows)
            {
                selectID.Items.Add(new ListItem(dr["nome"].ToString(), dr["id_cliente"].ToString()));
            }
            
            modeloProcedimento modeloproc = new modeloProcedimento();
            dt = modeloproc.getAll();
            dt.DefaultView.Sort = "[nome_procedimento] ASC";
            dt = dt.DefaultView.ToTable();
            
            foreach (DataRow dr in dt.Rows)
            {
                procedimento.Items.Add(new ListItem(dr["nome_procedimento"].ToString(), dr["id_procedimento"].ToString()));
            }

            modeloDentista md = new modeloDentista();
            dt = md.getAll(Convert.ToInt32(HttpContext.Current.Session["ID_CLINICA"]));
            dt.DefaultView.Sort = "[nome] ASC";
            dt = dt.DefaultView.ToTable();
            foreach (DataRow dr in dt.Rows)
            {
                dentista.Items.Add(new ListItem(dr["nome"].ToString(), dr["id_funcionario"].ToString()));
            }

            modeloOrcamento orc = new modeloOrcamento();
            Session["ORCAMENTOS_COM_CLIENTE"] = orc.getOrcamentosComClientes();    
        }

        [WebMethod]
        public static string getDados(string page, string rp, string sortname, string sortorder, string query, string qtype)
        {
            Grid grid = ((Grid)HttpContext.Current.Session["GRID_TRATAMENTO"]);
            grid.page = Convert.ToInt32(page);
            DataTable dt = grid.dados.Clone();

            if (string.IsNullOrEmpty(query))
            {
                int numeroItensPagina = Convert.ToInt32(rp);
                int numeroPagina = Convert.ToInt32(page);
                int inicio = numeroItensPagina * (numeroPagina - 1);

                for (int i = inicio; i < inicio + numeroItensPagina && i < grid.dados.Rows.Count; ++i)
                {
                    DataRow dr = dt.NewRow();
                    foreach (DataColumn dc in dt.Columns)
                        dr[dc.ColumnName] = grid.dados.Rows[i][dc.ColumnName];

                    dt.Rows.Add(dr);
                }
                if (dt.Rows.Count > 0)
                {
                    dt.DefaultView.Sort = sortname + " " + sortorder;
                    dt = dt.DefaultView.ToTable();
                }
            }
            else
            {
                dt = grid.dados.Copy();
                dt.DefaultView.RowFilter = string.Format("[{0}] like '%{1}%'", qtype, query);
                dt = dt.DefaultView.ToTable();
            }
            return grid.getDadosToJson(dt);
        }

        [WebMethod]
        public static string addToTable(string dados)
        {
            int id = 0;
            string[] array = dados.Split('|');
            modeloCliente mc = new modeloCliente(); //bruno adicionou
            modeloProcedimento mp = new modeloProcedimento(); //bruno adicionou
            string nome = mc.getClientNome(array[0]);//bruno adicionou
            string nome_procedimento = mp.getProcedimentoNome(array[1]); //bruno adicionou
            
            modeloProcedimentoCliente model = new modeloProcedimentoCliente();
            int p0 = 0; int p1 = 0; int p2 = 0; int p3 = 0, p6=0;
            try { p0 = Convert.ToInt32(array[1]); } catch (Exception e) { p0 = 0; }
            try { p1 = Convert.ToInt32(array[0]); } catch (Exception e) { p1 = 0; }
            try { p2 = Convert.ToInt32(array[4]); } catch (Exception e) { p2 = 0; }
            try { p3 = Convert.ToInt32(array[2]); } catch (Exception e) { p3 = 0; }
            try { p6 = Convert.ToInt32(array[6]); } catch (Exception e) { p6 = 0; }

            Componentes.Procedimento_Cliente proc =
                new Componentes.Procedimento_Cliente(-1, p0, p1, p2, p3, p6);
            if (p0 != 0 && 
                p1 != 0 && 
                p2 != 0 && 
                p3 != 0 &&
                p6 != 0)
            {
                if (new modeloProcedimentoCliente().getProcCliente(p0, p1))
                    return "PROCEDIMENTO_EXISTE";

                bool insercao = true;

                id = model.insert(proc);
                insercao = id != -1;
                try
                {

                    conexao.Open();
                    conexao.IniciaTransacao();

                    proc.IdProcedimentoCliente = id;
                    Grid grid = ((Grid)HttpContext.Current.Session["GRID_TRATAMENTO"]);
                    DataTable retorno = model.getProcedimentoCliente(id, false);
                    DataRow dr = grid.dados.NewRow();
                    dr["id_procedimento_cliente"] = id;
                    //bruno mudou aki - antes tava dr["nome"] = retorno.Rows[0]["nome"];
                    //agora ta
                    dr["nome"] = nome;
                    //bruno mudou aki - antes tava dr["nome_procedimento"] = retorno.Rows[0]["nome_procedimento"];
                    //agora ta
                    dr["nome_procedimento"] = nome_procedimento;
                    dr["tempo_tratamento"] = array[2];
                    dr["valor_parcela"] = array[3].Replace(".", ",");
                    dr["valor_total"] = proc.ValorTotal;
                    dr["dia_vencimento"] = array[5];
                    try { dr["nome_funcionario"] = array[6]; }
                    catch (Exception) { }

                    DateTime data = new DateTime();
                    int mes = DateTime.Now.Month;
                    int ano = DateTime.Now.Year;

                    int cont = 0;
                    modeloParcelas parcelas = new modeloParcelas();
                    double d = 0;

                    try { d = Convert.ToDouble(array[3].Replace(".", ",")); }
                    catch (Exception e) { }
                    insercao = insercao && parcelas.insertWithTransaction(new Componentes.Parcelas(-1,
                                                            d,
                                                            DateTime.Now,
                                                            id,
                                                            "EM DIA"));

                    for (int i = 1; i < Convert.ToInt32(array[2]); ++i)
                    {
                        int dia = Convert.ToInt32(array[5]);
                        for (int j = 0; j <= 5; ++j)
                        {
                            try
                            {
                                if (cont == 1)
                                    cont++;
                                else
                                    if (cont == 2)
                                    {
                                        mes--;
                                        ++cont;
                                    }
                                data = Convert.ToDateTime((dia) + "/" + (++mes) + "/" + (ano));
                                if (cont == 3)
                                    cont = 0;
                                break;
                            }
                            catch
                            {
                                if (mes > 12)
                                {
                                    mes = 0;
                                    ano++;
                                }
                                else
                                {
                                    dia = 1;
                                    ++cont;
                                }
                            }

                        }

                        d = 0;
                        try { d = Convert.ToDouble(array[3].Replace(".", ",")); }
                        catch (Exception e) { }
                        insercao = insercao && parcelas.insertWithTransaction(new Componentes.Parcelas(-1,
                                                                d,
                                                                data,
                                                                id,
                                                                "EM DIA"));

                    }

                    if (insercao)
                    {
                        conexao.Commit();
                        conexao.Close();

                        grid.total++;
                        grid.dados.Rows.Add(dr);

                        HttpContext.Current.Session["GRID_TRATAMENTO"] = grid;
                        return "adicionou";
                    }
                    else
                    {
                        conexao.RollBack();
                        conexao.Close();
                        if(id != 0)
                            model.delete(id);
                        return "Falha";
                    }
                }
                catch
                {
                    conexao.RollBack();
                    conexao.Close();
                    if (id != 0)
                        model.delete(id);
                    return "Falha";
                }
            }
            else { return "Falha"; }
        }

        [WebMethod]
        public static string editTable(int id, string dados)
        {
            string[] array = dados.Split('|');
            modeloProcedimentoCliente model = new modeloProcedimentoCliente();
            int p0 = 0; int p1 = 0; double p2 = 0; int p3 = 0, p6 = 0;
            try { p0 = Convert.ToInt32(array[1]); } catch (Exception e) { p0 = 0; }
            try { p1 = Convert.ToInt32(array[0]); } catch (Exception e) { p1 = 0; }
            try { p2 = Convert.ToDouble(array[4].Replace(".", ",")); }
            catch (Exception e) { p2 = 0; }
            try { p3 = Convert.ToInt32(array[2]); } catch (Exception e) { p3 = 0; }
            try { p6 = Convert.ToInt32(array[6]); } catch (Exception e) { p6 = 0; }

            Componentes.Procedimento_Cliente proc =
                new Componentes.Procedimento_Cliente(id, p0, p1, p2, p3, p6);

            Grid grid = ((Grid)HttpContext.Current.Session["GRID_TRATAMENTO"]);
            DataRow dr = grid.dados.Select("[id_procedimento_cliente]="+id)[0];

            dr["valor_parcela"] = Convert.ToDouble(array[3].Replace(".", ","));
            dr["valor_total"] = proc.ValorTotal;

            if (!TratamentosEquivalentes(proc))
                return "erro_tratamento";

            model.update(proc);
            model = new modeloProcedimentoCliente();
            String nomeCliente = (String)model.getProcedimentoCliente(id).Rows[0]["nome"];
            model = new modeloProcedimentoCliente();
            model.Log("Atualização", "Usuário " + HttpContext.Current.Session["ID_USUARIO_ACESSO"] + " - " + HttpContext.Current.Session["USUARIO"] + " fez alterações no Tratamento " + id+" - "+nomeCliente);

            modeloParcelas parcelas = new modeloParcelas();
            parcelas.update(new Componentes.Parcelas(-1,
                                                    Convert.ToDouble(array[3].Replace(".", ",")),
                                                    DateTime.Now,
                                                    id,
                                                    "EM DIA"));
            HttpContext.Current.Session["GRID_TRATAMENTO"] = grid;
            return "editou";
        }

        private static bool TratamentosEquivalentes(Procedimento_Cliente proc)
        {
            modeloProcedimento mp = new modeloProcedimento();
            DataTable velho = mp.getProcedimentosCliente(proc.IdCliente);
            DataTable novo = mp.getProcedimento(proc.IdProcedimento);
            return novo.Rows[0]["promocao"].Equals(velho.Rows[0]["promocao"]);
        }

        [WebMethod]
        public static string deleteFromTable(int id)
        {
            Grid grid = ((Grid)HttpContext.Current.Session["GRID_TRATAMENTO"]);
            grid.deleteFromTable(id);
            modeloProcedimentoCliente proc = new modeloProcedimentoCliente();
            
            String nomeCliente = (String)proc.getProcedimentoCliente(id).Rows[0]["nome"];
            proc = new modeloProcedimentoCliente();
            proc.delete(id);
            
            proc = new modeloProcedimentoCliente();
            proc.Log("Deleção", "Usuário " + HttpContext.Current.Session["ID_USUARIO_ACESSO"] + " - " + HttpContext.Current.Session["USUARIO"] + " deletou o Tratamento " + id+" - "+nomeCliente);

            HttpContext.Current.Session["GRID_TRATAMENTO"] = grid;
            return "removeu";
        }

        [WebMethod]
        public static string getDataFromProClient(int id)
        {
            modeloProcedimentoCliente model = new modeloProcedimentoCliente();
            DataTable retorno = model.getProcedimentoCliente(id);
            Grid grid = ((Grid)HttpContext.Current.Session["GRID_TRATAMENTO"]);

            DataRow[] drows = grid.dados.Select("[id_procedimento_cliente]="+id);

            string dentista = "";
            try
            {
                dentista = retorno.Rows[0]["nome_funcionario"] + "";
            }
            catch (Exception) { dentista = "Não Informado"; }

            string str = "";
            str += retorno.Rows[0]["nome"] + "|";
            str += retorno.Rows[0]["nome_procedimento"] + "|";
            str += retorno.Rows[0]["tempo_tratamento"] + "|";
            str += drows[0]["valor_parcela"] + "|";
            str += retorno.Rows[0]["valor_total"] + "|";            
            str += drows[0]["dia_vencimento"] + "|";
            str += dentista;

            return str;
        }

        protected void cliente_Init(object sender, EventArgs e)
        {
            modeloOrcamento modelo = new modeloOrcamento();
            foreach (DataRow dr in modelo.getClientesComOrcamento().Rows)
                cliente.Items.Add(new ListItem(dr["nome"].ToString(), dr["id_cliente"].ToString()));
        }

        [WebMethod]
        public static string getDataToOrcamento(int id_cliente)
        {
            if (HttpContext.Current.Session["ORCAMENTOS_COM_CLIENTE"] != null)
            {
                DataTable dt = ((DataTable)HttpContext.Current.Session["ORCAMENTOS_COM_CLIENTE"]);
                dt.DefaultView.RowFilter = "[id_cliente]=" + id_cliente;
                dt = dt.DefaultView.ToTable();
                string select = "<select name='ctl00$conteudo$tratamento' id='conteudo_tratamento' style='width:245px;'>";
                foreach(DataRow dr in dt.Rows)
                    select += string.Format("<option value='{0}'>{1}</option>", dr["id_procedimento"].ToString(), dr["nome_procedimento"].ToString());
                select += "</select>";
                return select;
            }
            return "";
        }

        [WebMethod]
        public static string addFromOrcamento(int id_cliente, int id_procedimento, int diaVenc)
        {
         
            modeloOrcamento modelOrc = new modeloOrcamento();
            DataTable Orc = modelOrc.getOrcamentoTotal(id_cliente, id_procedimento);

            modeloProcedimentoCliente model = new modeloProcedimentoCliente();
            double d0 = 0;
            int de1 = 0;
            
            try { d0 = Convert.ToDouble(Orc.Rows[0]["valor_total"]); }
            catch (Exception e) { }
            try { de1 = Convert.ToInt32(Orc.Rows[0]["tempo_tratamento"]); }
            catch (Exception e) { }

            Componentes.Procedimento_Cliente proc =
                new Componentes.Procedimento_Cliente(-1,
                                            id_procedimento,
                                            id_cliente,
                                            d0,
                                            de1, 0);
            bool insercao = true;
            int id = model.insert(proc);

            try{

                conexao.Open();
                conexao.IniciaTransacao();

                
                proc.IdProcedimentoCliente = id;
                Grid grid = ((Grid)HttpContext.Current.Session["GRID_TRATAMENTO"]);
                DataTable retorno = model.getProcedimentoCliente(id, false);
                DataRow dr = grid.dados.NewRow();
                dr["id_procedimento_cliente"] = id;
                dr["nome"] = retorno.Rows[0]["nome"];
                dr["nome_procedimento"] = retorno.Rows[0]["nome_procedimento"];
                dr["tempo_tratamento"] = Orc.Rows[0]["tempo_tratamento"];
                dr["valor_parcela"] = Orc.Rows[0]["valor_parcela"].ToString().Replace(".",",");
                dr["valor_total"] = proc.ValorTotal;
                dr["dia_vencimento"] = diaVenc;

                DateTime data = new DateTime();
                int mes = DateTime.Now.Month;
                int ano = DateTime.Now.Year;


                double d = 0.0;
               modeloParcelas parcelas = new modeloParcelas();
               try { d = Convert.ToDouble(Orc.Rows[0]["valor_parcela"].ToString().Replace(".", ",")); }
                    catch (Exception e) { }
               insercao = insercao && parcelas.insertWithTransaction(new Componentes.Parcelas(-1,
                                                       d,
                                                       DateTime.Now,
                                                       id,
                                                       "EM DIA"));

                int cont = 0;
                for (int i = 1; i < Convert.ToInt32(Orc.Rows[0]["tempo_tratamento"]); ++i)
                {
                    int dia = Convert.ToInt32(diaVenc);
                    for (int j = 0; j <= 5; ++j)
                    {
                        try
                        {
                            if (cont == 1)
                                cont++;
                            else
                                if (cont == 2)
                                {
                                    mes--;
                                    ++cont;
                                }
                            data = Convert.ToDateTime((dia) + "/" + (++mes) + "/" + (ano));

                            if (cont == 3)
                                cont = 0;
                            break;
                        }
                        catch
                        {
                            if (mes > 12)
                            {
                                mes = 0;
                                ano++;
                            }
                            else
                            {
                                dia = 1;
                                ++cont;
                            }
                        }

                    }
                    double de = 0;
                    try { de = Convert.ToDouble(Orc.Rows[0]["valor_parcela"].ToString().Replace(".", ",")); }
                    catch (Exception e) { }
                    insercao = insercao && parcelas.insertWithTransaction(new Componentes.Parcelas(-1,
                                                                    de,
                                                                    data,
                                                                    id,
                                                                    "EM DIA"));

                }

                if (insercao)
                {
                    conexao.Commit();
                    conexao.Close();

                    grid.total++;
                    grid.dados.Rows.Add(dr);

                    modelOrc = new modeloOrcamento();
                    modelOrc.delete(id_cliente, id_procedimento);
                    HttpContext.Current.Session["GRID_TRATAMENTO"] = grid;
                    return "adicionou";
                }
                else
                {
                    conexao.RollBack();
                    conexao.Close();
                    if(id ==0)
                    model.delete(id);
                    return "Falha";
                }
            }
            catch
            {
                conexao.RollBack();
                conexao.Close();
                return "Falha";
            }
        }


        /*
                registro += $("#selectID").val() + "|";
                registro += $("#duracao").val() + "|";
                registro += $("#valor_total").val();
         */
        [WebMethod]
        public static string openContract(string registro)
        {
            string contrato = new modeloProcedimentoCliente().getContrato();

            string[] array = registro.Split('|');
            DataTable dtDentista = new modeloDentista().getAll(Convert.ToInt32(HttpContext.Current.Session["ID_CLINICA"]));
            DataTable dtPaciente = new modeloCliente().getCliente(Convert.ToInt32(array[0]));

            if (dtDentista.Rows.Count == 0)
                return "Não existe Dentista Cadastrado nesta clinica";

            if (dtPaciente.Rows.Count == 0)
                return "Não existe Paciente Cadastrado com este código";// praticamente impossivel mass imvai saber..sim
            try
            {
                contrato = string.Format(contrato,
                                         dtDentista.Rows[0]["CIDADE"],
                                         dtPaciente.Rows[0]["NOME"],
                                         " Rua " + dtPaciente.Rows[0]["RUA"] + ", nº " + dtPaciente.Rows[0]["NUMERO"],
                                         dtPaciente.Rows[0]["CPF"],
                                         array[1],
                                         "R$ " + string.Format("{0:0.00}", Convert.ToDouble(array[2])),
                                         dtDentista.Rows[0]["NOME"]);
                HttpContext.Current.Session["REFRESH"] = contrato;
            }catch(Exception){}
            return "ok";
        }

        [WebMethod]
        public static string getProcedimentoFromParcela(string id_parcela)
        {
            modeloParcelas mp = new modeloParcelas();
            return mp.getProcedimentoFromParcela(id_parcela);
        }

        [WebMethod]
        public static string addNewParcela(int num, string date, string valor, int id)
        {
            try
            {

                bool insercao = true;
                conexao.Open();
                conexao.IniciaTransacao();

                DateTime data= new DateTime();
                double d = 0;

                try { d= Convert.ToDouble(valor.Replace(".", ",")); }
                catch { return "VALOR_INVALIDO"; }
                try
                {
                    data = Convert.ToDateTime(date);
                }
                catch
                {
                    return "ERRO_DATA";
                }

                int cont = 0;
                modeloParcelas parcelas = new modeloParcelas();

                insercao = insercao && parcelas.insertWithTransaction(new Componentes.Parcelas(-1,
                                                      d,
                                                      data,
                                                      id,
                                                      "EM DIA"));


                int mes = data.Month;
                int ano = data.Year;

                for (int i = 0; i < num - 1; ++i)
                {
                    int dia = data.Day;
                    for (int j = 0; j <= 5; ++j)
                    {
                        try
                        {
                            if (cont == 1)
                                cont++;
                            else
                                if (cont == 2)
                                {
                                    mes--;
                                    ++cont;
                                }
                            data = Convert.ToDateTime((dia) + "/" + (++mes) + "/" + (ano));
                            if (cont == 3)
                                cont = 0;
                            break;
                        }
                        catch
                        {
                            if (mes > 12)
                            {
                                mes = 0;
                                ano++;
                            }
                            else
                            {
                                dia = 1;
                                ++cont;
                            }
                        }

                    }

                    insercao = insercao && parcelas.insertWithTransaction(new Componentes.Parcelas(-1,
                                                            d,
                                                            data,
                                                            id,
                                                            "EM DIA"));

                }

                if (insercao)
                {
                    conexao.Commit();
                    conexao.Close();
                    new modeloProcedimentoCliente().updateNumParcelas(num, id, valor);

                    modeloProcedimentoCliente model = new modeloProcedimentoCliente();
                    Grid grid = new Grid(model.getAll(), "id_procedimento_cliente");
                    HttpContext.Current.Session["GRID_TRATAMENTO"] = grid;

                    return "adicionou";
                }
                else
                {
                    conexao.RollBack();
                    conexao.Close();
                    return "erro";
                }

            }
            catch (Exception e) { return "Erro. A Parcela não pôde ser Inserida"; }
        }
    }
}


